package com.chang.factory;

import org.springframework.beans.factory.FactoryBean;
import org.springframework.stereotype.Component;

import java.util.Calendar;

/**
 * 利用工厂模式创建对象
 *
 * FactoryBean是Spring提供的接口,Spring自动完成调用，获取指定的对象
 * 1.@Component标识类,作用是将该类交给Spring容器管理
 * 2.Spring中FactoryBean的讲解
 * 如果Spring加载的时候遇到FactoryBean接口,则会自动的执行重写的的方法getObject/getObjectType
 * 3.工厂模式说明
 * Map<key:calendar value=Calendar对象></>
 * 核心功能
 * 1.key：就是当前类型(如果自己编辑注解以注解为准)
 * 2.value: 调用getObject()获取的返回值对象
 * 将上述的数据交给Spring容器管理
 * 该功能什么时候使用？
 * 某些对象不能直接实例化
 * 整合其他第三方框架对象时，经常使用
 */
@Component("calendar")
public class CalendarFactory implements FactoryBean<Calendar> {

    public CalendarFactory(){
        System.out.println("CalendarFactory的无参构造");
    }

    @Override
    public Calendar getObject() throws Exception {
        //利用calendar的工具API 实现对象的创建
        return Calendar.getInstance();
    }

    @Override
    public Class<?> getObjectType() {
        //固定写法. 一般直接xxx.class即可
        return Calendar.class;
    }
//    @Configuration 标识配置类
//    @Bean 将自己方法的返回值交给Spring容器管理
//    @Component 将该类交给spring容器管理. 通过反射自动实例化对象
//    @ComponentScan(“com.jt”) 包扫描的注解 使Spring注解有效
}
